package com.zxy.day0624_util.utils;

import org.apache.commons.io.IOUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @Auther: Carre
 * @Date: 2021/9/16 16:47
 * @Description:文件工具类
 */
public class FileUtil {

    // 1、获取用户当前目录的路径
    public static File getUserDir() {
        //获取用户当前目录的路径
        String path = System.getProperty("user.dir");
        return new File(path);
    }

    // 2、获取操作系统目录的路径
    public static File getUserHomeDir() {
        String path = System.getProperty("user.home");
        return new File(path);
    }

    // 3、获取操作系统临时目录
    public static File getTmpDir() {
        String path =  System.getProperty("java.io.tmpdir");
        return new File(path);
    }

    // 4、获取一个文件的根路径
    public static File getRoot(File file) {
        //获取文件的路径
        String path = file.getPath();
        //根据:进行截取
        String substring = path.substring(0,  path.indexOf(":") + 1 );
        return new File(substring);
    }

    // 5-1、获取文件扩展名
    public static String getFileExtensions(String fileName)  {
        //获取文件最后一个.的下标
        int index = fileName.lastIndexOf(".");
        if(index < 0 ) {
            return "文件名不正确";
        }
        //根据下标截取
        String file_exten = fileName.substring(index);
        return file_exten;
    }

    // 5-2、获取文件扩展名
    public static String getFileExtensions(File file) {
        //获取文件名称
        String name = file.getName();
        return getFileExtensions(name);
    }

    // 6、删除文件或文件夹（递归删除：如果是目录，则目录下所有的文件和子目录都删除）
    public static void deletes(File file) {
        //获取其下子文件和子目录
        File[] files = file.listFiles();
        if(files != null && files.length > 0 ) {
            //循环遍历
            for (File f : files) {
                //如果是文件，直接删除
                if(f.isFile()) {
                    f.delete();
                }else {
                    //如果是目录，使用递归调用
                    deletes(f);
                }
            }
        }
        //将文件夹或者文件本身删除
        file.delete();
    }

    // 7、下载预览文件
    /**
     * 下载预览文件
     *
     * @param response
     * @param source       源文件
     * @param downloadName 下载的文件名
     * @param mode         模式  下载:0  预览:1
     * @throws IOException
     */
    public static void download(HttpServletResponse response, String source, String downloadName, int mode) throws IOException {
        String modeStr = "inline";
        if (mode == 0) {
            modeStr = "attachment";
            downloadName = new String(downloadName.getBytes("utf-8"), "iso-8859-1");
        }
        //设置请求头
        response.setHeader("Content-Disposition", modeStr + ";fileName=" + downloadName);
        InputStream iStream = new FileInputStream(source);
        IOUtils.copy(iStream, response.getOutputStream());
        iStream.close();
    }

    /**
     * 8、大文件，断点续传
     * @param part
     * @param index
     * @param token
     * @return
     */
    /*public static Map<String,Object> upload(MultipartFile part, int index, String token,String path,String exeName) {
        System.out.println("index is " + index);
        System.out.println("part is " + part);
        System.out.println("token is " + token);

        // 生成唯一的文件
        if (!StringUtils.hasText(token)) {
            token = UUID.randomUUID().toString()+exeName;
        }
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("token",token); // 生成文件名称
        map.put("index",index); // 上传片段
        // 直接用token 当成上传以后的文件名。
        // 判断文件是否存在
        File file = new File(path + token);
        // 文件不存在 而且是首个片段
        if (!file.exists() && index == 0) {
            try {
                part.transferTo(file);// 第0个片段 直接另存 就好了
            } catch (IllegalStateException | IOException e) {
                // TODO Auto-generated
                // catch block
                e.printStackTrace();
                map.put("result","error"); // 上传成功失败标记
                return map;
            } // 第一个片段上传成功
            System.out.println("第一个片段处理成功");
            map.put("result","ok"); // 上传成功失败标记
            return map;
        } else if (file.exists() && index > 0) {
            // 上传的是非第一个片段 进行追加
            try {
                // 打开原来已经上传成功文件输出流
                FileOutputStream outputStream = new FileOutputStream(file, true);
                // 获取正在上传文件片段的输入流
                InputStream inputStream = part.getInputStream();

                // 利用流拷贝 进行文件的追加
                byte b[] = new byte[1024]; // 追加
                int len=0;
                while ((len=inputStream.read(b)) > 0) {
                    outputStream.write(b,0,len);
                }
                outputStream.close();
            } catch (IOException e) { // TODO Auto-generated catch block
                e.printStackTrace();
                map.put("result","error"); // 上传成功失败标记
                return map;
            } // 片段追加成功
            System.out.println("中间片段处理成功");
            map.put("result","ok"); // 上传成功失败标记
            return map;
        } else { // 片段与编号不相符合 return new
            System.out.println("片段与编号不相符合 ");
            map.put("result","error"); // 上传成功失败标记
            return map;
        }

    }*/

    public static Map<String,Object> upload(MultipartFile part, int index, String token,String path) {
        System.out.println("index is " + index);
        System.out.println("part is " + part);
        System.out.println("token is " + token);

        // 生成唯一的文件
        if (!StringUtils.hasText(token)) {
            token = UUID.randomUUID().toString();
        }
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("token",token); // 生成文件名称
        map.put("index",index); // 上传片段
        // 直接用token 当成上传以后的文件名。
        // 判断文件是否存在
        File file = new File(path + token);
        // 文件不存在 而且是首个片段
        if (!file.exists() && index == 0) {
            try {
                part.transferTo(file);// 第0个片段 直接另存 就好了
            } catch (IllegalStateException | IOException e) {
                // TODO Auto-generated
                // catch block
                e.printStackTrace();
                map.put("result","error"); // 上传成功失败标记
                return map;
            } // 第一个片段上传成功
            System.out.println("第一个片段处理成功");
            map.put("result","ok"); // 上传成功失败标记
            return map;
        } else if (file.exists() && index > 0) {
            // 上传的是非第一个片段 进行追加
            try {
                // 打开原来已经上传成功文件输出流
                FileOutputStream outputStream = new FileOutputStream(file, true);
                // 获取正在上传文件片段的输入流
                InputStream inputStream = part.getInputStream();

                // 利用流拷贝 进行文件的追加
                byte b[] = new byte[1024]; // 追加
                int len=0;
                while ((len=inputStream.read(b)) > 0) {
                    outputStream.write(b,0,len);
                }
                outputStream.close();
            } catch (IOException e) { // TODO Auto-generated catch block
                e.printStackTrace();
                map.put("result","error"); // 上传成功失败标记
                return map;
            } // 片段追加成功
            System.out.println("中间片段处理成功");
            map.put("result","ok"); // 上传成功失败标记
            return map;
        } else { // 片段与编号不相符合 return new
            System.out.println("片段与编号不相符合 ");
            map.put("result","error"); // 上传成功失败标记
            return map;
        }

    }

}